// RAP [rh] ///******************************************************************************* // * Copyright (c) 2000, 2007 IBM Corporation and others. // * All rights reserved. This program and the accompanying materials // * are made available under the terms of the Eclipse Public License v1.0 // * which accompanies this distribution, and is available at // * http://www.eclipse.org/legal/epl-v10.html // * // * Contributors: // * IBM Corporation - initial API and implementation // *******************************************************************************/ //package org.eclipse.ui.internal.decorators; // //import org.eclipse.swt.graphics.Device; //import org.eclipse.swt.graphics.GC; //import org.eclipse.swt.graphics.Image; //import org.eclipse.swt.graphics.ImageData; //import org.eclipse.swt.graphics.PaletteData; //import org.eclipse.swt.graphics.RGB; // ///** // * DecorationImageBuilder is a utility class for merging images without data // * loss. // * // * @since 3.3 // * // */ //class DecorationImageBuilder { // // private static final int TOP_LEFT = LightweightDecoratorDefinition.TOP_LEFT; // private static final int TOP_RIGHT = LightweightDecoratorDefinition.TOP_RIGHT; // private static final int BOTTOM_LEFT = LightweightDecoratorDefinition.BOTTOM_LEFT; // private static final int BOTTOM_RIGHT = LightweightDecoratorDefinition.BOTTOM_RIGHT; // private static final int UNDERLAY = LightweightDecoratorDefinition.UNDERLAY; // // private static final PaletteData ALPHA_PALETTE, BW_PALETTE; // static { // RGB[] rgbs = new RGB[256]; // for (int i = 0; i < rgbs.length; i++) { // rgbs[i] = new RGB(i, i, i); // } // ALPHA_PALETTE = new PaletteData(rgbs); // BW_PALETTE = new PaletteData(new RGB[] { new RGB(0, 0, 0), // new RGB(255, 255, 255) }); // } // // private static int getTransparencyDepth(ImageData data) { // if (data.maskData != null && data.depth == 32) { // for (int i = 0; i < data.data.length; i += 4) { // if (data.data[i] != 0) // return 8; // } // } // if (data.maskData != null || data.transparentPixel != -1) // return 1; // if (data.alpha != -1 || data.alphaData != null) // return 8; // return 0; // } // // private static ImageData getTransparency(ImageData data, // int transparencyDepth) { // if (data == null) // return null; // if (transparencyDepth == 1) // return data.getTransparencyMask(); // ImageData mask = null; // if (data.maskData != null && data.depth == 32) { // ImageData m = data.getTransparencyMask(); // mask = new ImageData(data.width, data.height, 8, ALPHA_PALETTE, // data.width, new byte[data.width * data.height]); // for (int y = 0; y < data.height; y++) { // for (int x = 0; x < data.width; x++) { // int alpha = data.getPixel(x, y) & 0xFF; // if (alpha == 0) { // if (m.getPixel(x, y) != 0) // alpha = 255; // } // mask.setPixel(x, y, alpha); // } // } // } else if (data.maskData != null || data.transparentPixel != -1) { // ImageData m = data.getTransparencyMask(); // mask = new ImageData(data.width, data.height, 8, ALPHA_PALETTE, // data.width, new byte[data.width * data.height]); // for (int y = 0; y < mask.height; y++) { // for (int x = 0; x < mask.width; x++) { // mask.setPixel(x, y, m.getPixel(x, y) != 0 ? (byte) 255 : 0); // } // } // } else if (data.alpha != -1) { // mask = new ImageData(data.width, data.height, 8, ALPHA_PALETTE, // data.width, new byte[data.width * data.height]); // for (int i = 0; i < mask.data.length; i++) { // mask.data[i] = (byte) data.alpha; // } // } else if (data.alphaData != null) { // mask = new ImageData(data.width, data.height, 8, ALPHA_PALETTE, // data.width, data.alphaData); // } else { // mask = new ImageData(data.width, data.height, 8, ALPHA_PALETTE, // data.width, new byte[data.width * data.height]); // for (int i = 0; i < mask.data.length; i++) { // mask.data[i] = (byte) 255; // } // } // return mask; // } // // private static void composite(ImageData dst, ImageData src, int xOffset, // int yOffset) { // if (dst.depth == 1) { // for (int y = 0, dstY = y + yOffset; y < src.height; y++, dstY++) { // for (int x = 0, dstX = x + xOffset; x < src.width; x++, dstX++) { // if (0 <= dstX && dstX < dst.width && 0 <= dstY // && dstY < dst.height) { // if (src.getPixel(x, y) != 0) { // dst.setPixel(dstX, dstY, 1); // } // } // } // } // } else if (dst.depth == 8) { // for (int y = 0, dstY = y + yOffset; y < src.height; y++, dstY++) { // for (int x = 0, dstX = x + xOffset; x < src.width; x++, dstX++) { // if (0 <= dstX && dstX < dst.width && 0 <= dstY // && dstY < dst.height) { // int srcAlpha = src.getPixel(x, y); // int dstAlpha = dst.getPixel(dstX, dstY); // dstAlpha += (srcAlpha - dstAlpha) * srcAlpha / 255; // dst.setPixel(dstX, dstY, dstAlpha); // } // } // } // } // } // // /** // * Create a composite image by underlaying and overlaying the base image. // * @param device // * @param base // * @param overlay // * @return Image // */ // static Image compositeImage(Device device, ImageData base, // ImageData[] overlay) { // if (base == null) // return null; // Image image = new Image(device, new ImageData(base.width, base.height, // 24, new PaletteData(0xff, 0xff00, 0xff00000))); // GC gc = new GC(image); // ImageData src; // int maskDepth = 0, baseMaskDepth = 0; // ImageData underlay = src = overlay.length > UNDERLAY ? overlay[UNDERLAY] // : null; // if (src != null) { // maskDepth = Math.max(maskDepth, getTransparencyDepth(src)); // Image img = new Image(device, src); // gc.drawImage(img, 0, 0); // img.dispose(); // } // src = base; // if (base != null) { // maskDepth = Math.max(maskDepth, // baseMaskDepth = getTransparencyDepth(src)); // Image img = new Image(device, src); // gc.drawImage(img, 0, 0); // img.dispose(); // } // ImageData topLeft = src = overlay[TOP_LEFT]; // if (src != null) { // maskDepth = Math.max(maskDepth, getTransparencyDepth(src)); // Image img = new Image(device, src); // gc.drawImage(img, 0, 0); // img.dispose(); // } // ImageData topRight = src = overlay[TOP_RIGHT]; // if (src != null) { // maskDepth = Math.max(maskDepth, getTransparencyDepth(src)); // Image img = new Image(device, src); // gc.drawImage(img, base.width - src.width, 0); // img.dispose(); // } // ImageData bottomLeft = src = overlay[BOTTOM_LEFT]; // if (src != null) { // maskDepth = Math.max(maskDepth, getTransparencyDepth(src)); // Image img = new Image(device, src); // gc.drawImage(img, 0, base.height - src.height); // img.dispose(); // } // ImageData bottomRight = src = overlay[BOTTOM_RIGHT]; // if (src != null) { // maskDepth = Math.max(maskDepth, getTransparencyDepth(src)); // Image img = new Image(device, src); // gc.drawImage(img, base.width - src.width, base.height - src.height); // img.dispose(); // } // gc.dispose(); // if (baseMaskDepth > 0) { // ImageData newData = image.getImageData(); // image.dispose(); // ImageData mask = null; // switch (maskDepth) { // case 1: // mask = new ImageData(base.width, base.height, maskDepth, // BW_PALETTE); // break; // case 8: // mask = new ImageData(base.width, base.height, maskDepth, // ALPHA_PALETTE, base.width, new byte[base.width // * base.height]); // break; // } // src = getTransparency(underlay, maskDepth); // if (src != null) // composite(mask, src, 0, 0); // src = getTransparency(base, maskDepth); // if (src != null) // composite(mask, src, 0, 0); // src = getTransparency(topLeft, maskDepth); // if (src != null) // composite(mask, src, 0, 0); // src = getTransparency(topRight, maskDepth); // if (src != null) // composite(mask, src, mask.width - src.width, 0); // src = getTransparency(bottomLeft, maskDepth); // if (src != null) // composite(mask, src, 0, mask.height - src.height); // src = getTransparency(bottomRight, maskDepth); // if (src != null) // composite(mask, src, mask.width - src.width, mask.height // - src.height); // switch (maskDepth) { // case 1: // newData.maskData = mask.data; // newData.maskPad = mask.scanlinePad; // break; // case 8: // newData.alphaData = mask.data; // break; // } // image = new Image(device, newData); // } // return image; // } // //}